/*
    Estado        Metodo
    P        listarCampanias         Mauri
    P        obtenerMicrositioDeCampania Mauri
    P        modificarCampania- esteban
    ok        guardarDestacados - esteban
    P        listarBannersPorCampania Mauri
    ok        eliminarDestacado- esteban
    P        insertarBanners- esteban
    OK       eliminarBanners- esteban
    ok        obtenerBanners - esteban
    P        obtenerCampaniaDeMicrositio - esteban - diego
    OK        obtenerArticulosCampaniaPorBanners- esteban
    OK        listarTarjetasCreditoPorCampania- esteban
    OK        obtenerPlanesTarjetaPorCampaniaYTarjeta- esteban
 */

package dal;

import static java.lang.System.*;

import bd.*;

import excepciones.AvwException;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.logging.Level;
import java.util.logging.Logger;

import negocio.ArticuloCampania;
import negocio.ArticuloWeb;
import negocio.BannersWeb;
import negocio.CampaniaWeb;
import negocio.CategoriaWeb;
import negocio.Cliente;
import negocio.Marca;
import negocio.MicrositioWeb;
import negocio.PlanTarjeta;
import negocio.Tarjeta;
import negocio.Ubicacion;
import static java.sql.Types.*;

import util.Utiles;

public class CampaniaDAL {
    
    static final Logger logger = Utiles.iniciarLogger("CampaniaDAL", false);
    
    /**
     * Retorna una lista de todas las campanias a partir
     * de la tabla de etercor y de los datos del micrositio
     * asociado de la tabla de este sistema.
     * @return objeto ArrayList de objetos CampaniaWeb.
     */
    public static ArrayList<CampaniaWeb> listarCampanias()throws AvwException {
        ArrayList<CampaniaWeb> arrCampanias = new ArrayList<CampaniaWeb>();
        
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        
        sql.append("SELECT ");
        sql.append("cam_codigo, ");
        sql.append("cam_nombre, ");
        sql.append("cam_fecha_desde, ");
        sql.append("cam_fecha_hasta ");
        sql.append("FROM campanias ");
        sql.append("ORDER BY cam_nombre ");
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,null);
            
            while (rs.next()) {
                CampaniaWeb campania = new CampaniaWeb();
                campania.setCamCodigo(rs.getString("cam_codigo"));
                campania.setCamNombre(rs.getString("cam_nombre"));
                campania.setCamFechaDesde(rs.getDate("cam_fecha_desde"));
                campania.setCamFechaHasta(rs.getDate("cam_fecha_hasta"));
                arrCampanias.add(campania);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
            
        }
        
        return arrCampanias;
    }
    
    /**
     * Retorna una lista de todas las campanias VIGENTES a partir
     * de la tabla de etercor y de los datos del micrositio
     * asociado de la tabla de este sistema.
     * @return objeto ArrayList de objetos CampaniaWeb.
     */
    public static ArrayList<CampaniaWeb> listarCampaniasVigente()throws AvwException {
        ArrayList<CampaniaWeb> arrCampanias = new ArrayList<CampaniaWeb>();
        
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        
        sql.append("SELECT ");
        sql.append("cam_codigo, ");
        sql.append("cam_nombre, ");
        sql.append("cam_fecha_desde, ");
        sql.append("cam_fecha_hasta ");
        sql.append("FROM campanias ");
        sql.append("WHERE cam_fecha_hasta >= sysdate ");
        sql.append("ORDER BY cam_nombre ");
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,null);
            
            while (rs.next()) {
                CampaniaWeb campania = new CampaniaWeb();
                campania.setCamCodigo(rs.getString("cam_codigo"));
                campania.setCamNombre(rs.getString("cam_nombre"));
                campania.setCamFechaDesde(rs.getDate("cam_fecha_desde"));
                campania.setCamFechaHasta(rs.getDate("cam_fecha_hasta"));
                arrCampanias.add(campania);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
            
        }
        
        return arrCampanias;
    }

    /**
     * Retornar el objeto MicrositioWeb de la campania pasada por parametro.
     * @return objeto MicrositioWeb del objeto CampaniaWeb pasado por parametro.
     * @param campaniaWeb CampaniaWeb (con solo el codigo).
     */
    public static MicrositioWeb obtenerMicrositioDeCampania(CampaniaWeb campaniaWeb)throws AvwException {
        MicrositioWeb micrositioWeb = new MicrositioWeb();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT ");
        sql.append("m.msw_codigo, ");
        sql.append("m.msw_nombre, ");
        sql.append("m.msw_url ");
        sql.append("FROM ");
        sql.append("micro_sitio_web m ");
        sql.append("WHERE ");
        sql.append("m.cam_codigo = ? ");
        
        params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,params);
            
            if (rs.next()){
                micrositioWeb.setMswCodigo(util.Utiles.noNull(rs.getString(1)));
                micrositioWeb.setMswNombre(util.Utiles.noNull(rs.getString(2)));
                micrositioWeb.setMswUrl(util.Utiles.noNull(rs.getString(3)));
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return micrositioWeb;
    }
    
    /**
     * Lista los banners existentes por cada campania.
     * @return: ArrayList de BannersWeb de una campania.
     * @param: campaniaWeb CampaniaWeb (con solo codigo).
     */
    public static ArrayList<BannersWeb> listarBannersPorCampania(CampaniaWeb campaniaWeb) throws AvwException {
        
        ArrayList<BannersWeb> arlbanners = new ArrayList<BannersWeb>();
        
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT ");
        sql.append("ban_codigo, ");
        sql.append("ban_nombre, ");
        sql.append("ban_url ");
        sql.append("FROM ");
        sql.append("banners_web ");
        sql.append("WHERE ");
        sql.append("cam_codigo = ? ");
        
        params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
        try {
            logger.info("SELECT los banners_web de la campania");
            logger.info(sql.toString());
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,params);
            
            while (rs.next()) {
                BannersWeb bannersWeb = new BannersWeb();
                bannersWeb.setBanCodigo(rs.getString("ban_codigo"));
                bannersWeb.setBanNombre(rs.getString("ban_nombre"));
                bannersWeb.setBanUrl(rs.getString("ban_url"));
                //No se busca el articulo, pq se busca cuando se pide explicitamente
                arlbanners.add(bannersWeb);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            conexion.cerrarConexion();
        }
        
        return arlbanners;
    }
    
    /**
     * Crea una CampaniaWeb
     * Solo se guarda la asignacion del microsito.
     * @param campaniaWeb CampaniaWeb con el objeto MicrositioWeb en su atributo.
     */
    public static void modificarCampania(CampaniaWeb campaniaWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        try {
            /*
             Se modifica el micrositio el cual tiene la campania a insertar,
             poniendo en '' el campo campania. Permitiendo q haya un solo
             microstio por campania.
             */
            sql.append("UPDATE ");
            sql.append("micro_sitio_web ");
            sql.append("SET ");
            sql.append("cam_codigo = '' ");
            sql.append("WHERE ");
            sql.append("cam_codigo = ? ");
            
            params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
            
            conexion.abrirConexion();
            conexion.executePreparedStatement(sql,params);
            
            /*Se modifica el micrositio*/
            sql.setLength(0);
            sql.append("UPDATE ");
            sql.append("micro_sitio_web ");
            sql.append("SET ");
            sql.append("cam_codigo = ? ");
            sql.append("WHERE ");
            sql.append("msw_codigo = ? ");
            
            params.clear();
            pos = 0;
            params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
            params.add(new BoundParam(++pos,campaniaWeb.getCamMicrositioWeb().getMswCodigo(),VARCHAR));
            
            conexion.executePreparedStatement(sql,params);
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
    }
    
    /**
     * Se crea un registro de destacados.
     * @param articulosCampanias ArrayList de objetos ArticuloCampania
     * con el objeto ArticuloWeb y Destacado
     * y este ultimo con su correspondiente objeto CategoriaWeb.
     */
    public static void insertarDestacados(ArrayList<ArticuloCampania> articulosCampanias,
            CampaniaWeb campania)throws AvwException {
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        try {
            for (ArticuloCampania articulos: articulosCampanias) {
                StringBuilder sql = new  StringBuilder();
                if (articulos.getArcDestacado().getDesNivel()!=2){
                    sql.append("DELETE FROM DESTACADOS_WEB ");
                    sql.append("WHERE ART_CODIGO = ? ");
                    sql.append("AND CAM_CODIGO = ? ");
                    sql.append("AND CAW_CODIGO = ? ");
                    sql.append("AND DES_NIVEL = ? ");
                    params.clear();
                    pos=0;
                    params.add(new BoundParam(++pos,articulos.getArcArticulo().getArtCodigo(),VARCHAR));
                    params.add(new BoundParam(++pos,campania.getCamCodigo(),VARCHAR));
                    params.add(new BoundParam(++pos,articulos.getArcArticulo().getArwCategoria().getCawCodigo(),VARCHAR));
                    params.add(new BoundParam(++pos,articulos.getArcDestacado().getDesNivel(),VARCHAR));
                    
                    conexion.abrirConexion();
                    conexion.executePreparedStatement(sql,params);
                    
                    sql.setLength(0);
                    sql.append("INSERT INTO DESTACADOS_WEB (");
                    sql.append("   ART_CODIGO, CAM_CODIGO, CAW_CODIGO, DES_NIVEL)");
                    sql.append("VALUES ( ?,?,?,? )");
                    conexion.executePreparedStatement(sql,params);
                } else{ // entonces es flash
                    sql.append("DELETE FROM DESTACADOS_WEB ");
                    sql.append("WHERE CAM_CODIGO = ? ");
                    sql.append("AND CAW_CODIGO = ? ");
                    sql.append("AND DES_NIVEL = ? ");
                    params.clear();
                    pos=0;
                    params.add(new BoundParam(++pos,campania.getCamCodigo(),VARCHAR));
                    params.add(new BoundParam(++pos,articulos.getArcArticulo().getArwCategoria().getCawCodigo(),VARCHAR));
                    params.add(new BoundParam(++pos,articulos.getArcDestacado().getDesNivel(),VARCHAR));
                    
                    conexion.abrirConexion();
                    conexion.executePreparedStatement(sql,params);
                    
                    sql.setLength(0);
                    sql.append("INSERT INTO DESTACADOS_WEB (");
                    sql.append("   CAM_CODIGO, CAW_CODIGO, DES_NIVEL, ART_CODIGO)");
                    sql.append("VALUES ( ?,?,?,? )");
                    params.add(new BoundParam(++pos,articulos.getArcArticulo().getArtCodigo(),VARCHAR));
                    conexion.executePreparedStatement(sql,params);
                }   // fin for para saber si es flash
            }   // fin for
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
    }
    
        /**
     * Se elimina el articulos relacionado con el banners de la Base de Datos.
     * @param: articuloCampania con su objeto ArticuloWeb 
     * y este ultimo con su correspondiente artCodigo.
     * @param: bannersWeb con su respectivo banCodigo.
     */
    public static void eliminarArticulosBanners(ArticuloCampania articuloCampania,
            BannersWeb bannersWeb)throws AvwException{
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("DELETE FROM ");
        sql.append("articulos_banners_web ");
        sql.append("WHERE art_codigo LIKE ? ");
        sql.append("AND ban_codigo LIKE ? ");
        
        params.add(new BoundParam(++pos,articuloCampania.getArcArticulo().getArtCodigo(),VARCHAR));
        params.add(new BoundParam(++pos,bannersWeb.getBanCodigo(),VARCHAR));
        
        
        try {
            logger.info("Realizo un delete de la tabla articulos_banners_web");
            logger.info(sql.toString());
            conexion.abrirConexion();
            conexion.executePreparedStatement(sql,params);
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * Se elimina el destacado de la Base de Datos.
     * @param: articuloCampania ArticuloCampania con su objeto
     * ArticuloWeb y Destacado
     * y este ultimo con su correspondiente objeto CategoriaWeb.
     */
    public static void eliminarDestacado(ArticuloCampania articuloCampania,
            CampaniaWeb campaniaWeb)throws AvwException{
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("DELETE FROM ");
        sql.append("destacados_web ");
        sql.append("WHERE art_codigo LIKE ? ");
        sql.append("AND cam_codigo LIKE ? ");
        sql.append("AND caw_codigo LIKE ? ");
        sql.append("AND des_nivel LIKE ? ");
        params.add(new BoundParam(++pos,articuloCampania.getArcArticulo().getArtCodigo(),VARCHAR));
        params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
        params.add(new BoundParam(++pos,articuloCampania.getArcDestacado().getCawCategoria().getCawCodigo(),VARCHAR));
        params.add(new BoundParam(++pos,articuloCampania.getArcDestacado().getDesNivel(),VARCHAR));
        
        try {
            conexion.abrirConexion();
            conexion.executePreparedStatement(sql,params);
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * @param campaniaWeb CampaniaWeb (con solo el codigo, objeto
     * BannersWeb y array de objetos AticuloWeb con solo el codigo).
     */
    public static void insertarBanners  (CampaniaWeb campaniaWeb,
            BannersWeb bannersWeb,
            ArrayList<ArticuloWeb> arrayArticulos) throws AvwException {
        
        
        StringBuilder sql = new StringBuilder();
        String codigo = "";
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        try{
            ResultSet rs;
            //Obtengo el codigo con el q debo insertar
            sql.append("select ban_codigo.nextval  from dual");
            conexion.abrirConexion();
            
            rs = conexion.getPreparedStatementResultSet(sql,null);
            pos=0;
            sql.setLength(0);
            rs.next();
            codigo = rs.getString(1);
            logger.info("Inserta Banners");
            
            sql.append("INSERT INTO ");
            sql.append("banners_web( ");
            sql.append("ban_codigo, ");
            sql.append("ban_nombre, ");
            sql.append("ban_url, ");
            sql.append("cam_codigo ");
            sql.append(") ");
            sql.append("VALUES ( ?,?,?,?) ");
            
            params.add(new BoundParam(++pos,codigo,NUMERIC));
            params.add(new BoundParam(++pos,bannersWeb.getBanNombre(),VARCHAR));
            params.add(new BoundParam(++pos,bannersWeb.getBanUrl(),VARCHAR));
            params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
            conexion.startTransaction();
            conexion.executePreparedStatement(sql,params);
            
            String sqlArticulos =
                    "INSERT INTO ARTICULOS_BANNERS_WEB (\n" +
                    "   ART_CODIGO, BAN_CODIGO) VALUES ( ?,? )";
            PreparedStatement s;
            ArrayList<ArticuloWeb> arrayArticulosWeb = new ArrayList<ArticuloWeb>();
            if (arrayArticulos != null){
                arrayArticulosWeb = arrayArticulos;
            }
            for (ArticuloWeb a: arrayArticulosWeb) {
                params.clear();
                pos=0;
                params.add(new BoundParam(++pos,a.getArtCodigo(),VARCHAR));
                params.add(new BoundParam(++pos,codigo,VARCHAR));
                //Puede tirar Error???.
                conexion.executePreparedStatement(sqlArticulos,params);
            }
            conexion.commitTransaction();
        } catch (SQLException e) {
            try {
                conexion.rollbackTransaction();
            } catch (SQLException ex) {
                logger.log(Level.SEVERE, e.getMessage(), e);
            }
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
    }
    
    /**
     * @param campaniaWeb CampaniaWeb (con solo el codigo, objeto
     * BannersWeb y array de objetos AticuloWeb con solo el codigo).
     */
    public static void modificarBanners(CampaniaWeb campaniaWeb,
            BannersWeb bannersWeb,
            ArrayList<ArticuloCampania> arrayArticulos) throws AvwException {
        
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        
        try {
            conexion.abrirConexion();
            for (ArticuloCampania articuloCampania : arrayArticulos){
                StringBuilder sqlDelete = new StringBuilder();
                sqlDelete.append("DELETE FROM ");
                sqlDelete.append("articulos_banners_web ");
                sqlDelete.append("WHERE art_codigo LIKE ? ");
                sqlDelete.append("AND ban_codigo LIKE ? ");
                params.clear();
                pos=0;
                params.add(new BoundParam(++pos,articuloCampania.getArcArticulo().getArtCodigo(),VARCHAR));
                params.add(new BoundParam(++pos,bannersWeb.getBanCodigo(),VARCHAR));

                logger.info("Realizo un delete de la tabla articulos_banners_web");
                logger.info(sqlDelete.toString());
                conexion.executePreparedStatement(sqlDelete,params);
            }
            params.clear();
            pos=0;
            
            sql.append("UPDATE ");
            sql.append("banners_web ");
            sql.append("SET ");
            sql.append("ban_nombre= ? , ban_url= ? , cam_codigo= ? ");
            sql.append("WHERE ");
            sql.append("ban_codigo = ? ");
            
            params.add(new BoundParam(++pos,bannersWeb.getBanNombre(),VARCHAR));
            params.add(new BoundParam(++pos,bannersWeb.getBanUrl(),VARCHAR));
            params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
            params.add(new BoundParam(++pos,bannersWeb.getBanCodigo(),NUMERIC));
            conexion.executePreparedStatement(sql,params);
            
            String sqlArticulos =
                    "INSERT INTO ARTICULOS_BANNERS_WEB (\n" +
                    "   ART_CODIGO, BAN_CODIGO) \n" + "VALUES ( ?,? )";
            conexion.startTransaction();
            for (ArticuloCampania a: arrayArticulos) {
                params.clear();
                pos=0;
                params.add(new BoundParam(++pos,a.getArcArticulo().getArtCodigo(),VARCHAR));
                params.add(new BoundParam(++pos,bannersWeb.getBanCodigo(),VARCHAR));
                conexion.executePreparedStatement(sqlArticulos,params);
            }
            conexion.commitTransaction();
        } catch (SQLException e) {
            try {
                conexion.rollbackTransaction();
            } catch (SQLException ex) {
                logger.log(Level.SEVERE,ex.getMessage(),ex);
            }
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * Elimina el bannnersn que fue enviado por parametros
     * @param banners BannersWeb (con solo el codigo).
     */
    public static void eliminarBanners(BannersWeb banners)throws AvwException {
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        try {
            
            sql.append("DELETE FROM ");
            sql.append("articulos_banners_web ");
            sql.append("WHERE ");
            sql.append("ban_codigo = ? ");
            params.add(new BoundParam(++pos,banners.getBanCodigo(),NUMERIC));
            
            conexion.abrirConexion();
            logger.info("DELETE articulos_banners_web ");
            logger.info(sql.toString());
            conexion.startTransaction();
            conexion.executePreparedStatement(sql,params);
            
            params.clear();
            pos=0;
            sql.setLength(0);
            
            sql.append("DELETE FROM ");
            sql.append("banners_web ");
            sql.append("WHERE ");
            sql.append("ban_codigo = ? ");
            
            params.add(new BoundParam(++pos,banners.getBanCodigo(),NUMERIC));
            logger.info("DELETE banners_web");
            logger.info(sql.toString());
            conexion.executePreparedStatement(sql,params);
            conexion.commitTransaction();
            
        } catch (SQLException e) {
            try {
                conexion.rollbackTransaction();
            } catch (SQLException ex) {
                logger.log(Level.SEVERE,ex.getMessage(),ex);
            }
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * @return objeto BannersWeb.
     * @param banners BannersWeb (con solo el codigo).
     */
    public static BannersWeb obtenerBanners(BannersWeb banners) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT ");
        sql.append("bn.ban_codigo, ");
        sql.append("bn.ban_nombre, ");
        sql.append("bn.ban_url ");
        sql.append("FROM ");
        sql.append("banners_web bn ");
        sql.append("WHERE ");
        sql.append("bn.ban_codigo = ?");
        
        
        try {
            params.add(new BoundParam(++pos,banners.getBanCodigo(),NUMERIC));
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,params);
            if (rs.next()){
                banners.setBanCodigo(rs.getString(1));
                banners.setBanNombre(rs.getString(2));
                banners.setBanUrl(rs.getString(3));
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return banners;
    }
    
    /**
     * @return el objeto CampaniaWeb a partir del objeto de MicrositioWeb pasado por parametro.
     * @param sitio MicrositioWeb (solo con el codigo).
     */
    public static CampaniaWeb obtenerCampaniaDeMicrositio(MicrositioWeb sitio)throws AvwException {
        CampaniaWeb campania = new CampaniaWeb();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT ");
        sql.append("cm.cam_codigo, ");
        sql.append("cm.cam_nombre, ");
        sql.append("cm.cam_fecha_desde, ");
        sql.append("cm.cam_fecha_hasta ");
        sql.append("FROM ");
        sql.append("campanias cm, ");
        sql.append("micro_sitio_web ms ");
        sql.append("WHERE ");
        sql.append(" ms.msw_codigo = ? ");
        sql.append(" AND ms.cam_codigo = cm.cam_codigo");
        
        logger.info("consulto si el micrositio: "+sitio.getMswCodigo() + " tiene campania." );
        
        try {
            params.add(new BoundParam(++pos,sitio.getMswCodigo(),NUMERIC));
            
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,params);
            
            rs.next();
            campania.setCamCodigo(rs.getString(1));
            campania.setCamNombre(rs.getString(2));
            campania.setCamFechaDesde(rs.getDate(3));
            campania.setCamFechaHasta(rs.getDate(4));
            campania.setCamMicrositioWeb(sitio);
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return campania;
    }
    /**
     * @return array de objetos ArticuloCampania(con solo el codigo, nombre, 
     * descripcion) del banners cuyo objeto se pasa por parametro.
     * @param banners BannersWeb (con solo el codigo). y la Campania al cual pertenece el banner
     */
    public static ArrayList<ArticuloCampania> obtenerArticulosCampaniaPorBanners(BannersWeb banners, CampaniaWeb campaniaWeb)throws AvwException {
        ArrayList<ArticuloCampania> articuloBanner =
                new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        sql.append("SELECT   acv.art_codigo,  acv.art_nombre, ");
        sql.append("acv.art_descr_comercial, ");
        sql.append("acv.caw_codigo, acv.caw_nombre ");
        sql.append("FROM articulos_campanias_vista acv, ");
        sql.append("articulos_banners_web abw,banners_web bw ");
        sql.append("WHERE abw.art_codigo = acv.art_codigo ");
        sql.append("AND abw.ban_codigo = bw.ban_codigo ");
        sql.append("AND bw.ban_codigo = ? ");
        sql.append("AND acv.cam_codigo = ? ");
        sql.append("ORDER BY acw_pedido DESC ");
        
        
 
        params.add(new BoundParam(++pos,banners.getBanCodigo(),NUMERIC ));
        params.add(new BoundParam(++pos, campaniaWeb.getCamCodigo(),VARCHAR));
        
        logger.info(sql.toString());
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,params);
            
            while (rs.next()) {
                ArticuloCampania articulo = new ArticuloCampania();
                ArticuloWeb articuloWeb = new ArticuloWeb(rs.getString("art_codigo"));
                articuloWeb.setArtNombre(rs.getString("art_nombre"));
                articuloWeb.setArtDescripcion(rs.getString("art_descr_comercial"));
                
                articulo.setArcArticulo(articuloWeb);
                
                articuloBanner.add(articulo);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return articuloBanner;
    }
    /**
     * @return array de objetos ArticuloCampania del banners cuyo objeto se pasa por parametro.
     * @param banners BannersWeb (con solo el url del banners).
     */
    public static ArrayList<ArticuloCampania> obtenerArticulosCampaniaPorUrlBanners(BannersWeb banners)throws AvwException {
        ArrayList<ArticuloCampania> articuloBanner =
                new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT * ");
        sql.append("FROM ( ");
        sql.append("SELECT  acv.art_codigo, acv.acw_consulta, acv.acw_pedido, ");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre, ");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial, ");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
        sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, ");
        sql.append("faw_nivel, bw.ban_codigo, bw.ban_nombre ");
	sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw, ");
	sql.append("articulos_banners_web abw, banners_web bw ");
	sql.append("WHERE acv.art_codigo = faw.art_codigo(+) ");
	sql.append("AND abw.art_codigo = acv.art_codigo ");
	sql.append("AND abw.ban_codigo = bw.ban_codigo ");
        sql.append("AND bw.CAM_CODIGO = acv.CAM_CODIGO ");
	sql.append("AND bw.BAN_URL =  ? ");
	sql.append("ORDER BY acw_pedido DESC ");
        sql.append(") ");
        sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");

        params.add(new BoundParam(++pos,banners.getBanUrl(),VARCHAR));
        
        logger.info(sql.toString());
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql,params);
            
            while (rs.next()) {
                ArticuloCampania articulo = new ArticuloCampania();
                ArticuloWeb articuloWeb = new ArticuloWeb(rs.getString("art_codigo"));
                articuloWeb.setArtNombre(rs.getString("art_nombre"));
                articuloWeb.setArtDescripcion(rs.getString("art_descr_comercial"));
                Marca marca = new Marca();
                marca.setMarCodigo(rs.getString("mar_codigo"));
                marca.setMarNombre(rs.getString("mar_nombre"));
                articuloWeb.setArtMarcaCodigo(marca);
                
                CategoriaWeb categoriaWeb = new CategoriaWeb();
                categoriaWeb.setCawCodigo("caw_codigo");
                categoriaWeb.setCawNombre("caw_nombre");
                articuloWeb.setArwCategoria(categoriaWeb);
                
                articulo.setArcArticulo(articuloWeb);
                articulo.setArcPrecioLista(Float.parseFloat(rs.getString("lpal_precio")));
                articulo.setArcPrecioDescuento(Float.parseFloat(rs.getString("lpad_precio")));
                articuloBanner.add(articulo);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return articuloBanner;
    }
    
    /**
     * @return un array de objetos Tarjeta que estan asignadas a la campania que se pasa por parametro.
     * @param campaniaWeb CampaniaWeb (con solo el codigo)
     */
    public static ArrayList<Tarjeta> listarTarjetasCreditoPorCampania(CampaniaWeb campaniaWeb) throws AvwException {
        ArrayList<Tarjeta> tarjetas = new ArrayList<Tarjeta>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT DISTINCT ");
        sql.append("tc.tar_codigo, ");
        sql.append("tc.tar_nombre ");
        sql.append("FROM ");
        sql.append("tarjetas_credito tc, ");
        sql.append("campanias_plan_tarjeta campt, ");
        sql.append("plan_tarjeta_credito ptc ");
        sql.append("WHERE ");
        sql.append("campt.cam_codigo LIKE ? ");
        sql.append(" AND ");
        sql.append("ptc.plt_codigo LIKE ");
        sql.append("campt.plt_codigo ");
        sql.append("AND ");
        sql.append("ptc.tar_codigo LIKE ");
        sql.append("tc.tar_codigo");
        params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR ));
        
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql.toString(),params);
            while (rs.next()) {
                Tarjeta tarjeta = new Tarjeta();
                tarjeta.setTarCodigo(rs.getString(1));
                tarjeta.setTarNombre(rs.getString(2));
                tarjetas.add(tarjeta);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        return tarjetas;
    }
    
    /**
     *
     * @return array de PlanTarjeta asociada a la campania y a la tarjeta pasada por parametro.
     * @param campaniaWeb CampaniaWeb (con solo el codigo)
     * @param tarjeta Tarjeta (con solo el codigo)
     */
    public static ArrayList<PlanTarjeta> obtenerPlanesTarjetaPorCampaniaYTarjeta(CampaniaWeb campaniaWeb,
            Tarjeta tarjeta)throws AvwException {
        ArrayList<PlanTarjeta> planes = new ArrayList<PlanTarjeta>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        sql.append("SELECT ");
        sql.append("ptc.plt_codigo, ");
        sql.append("ptc.tar_codigo, ");
        sql.append("ptc.plt_nombre, ");
        sql.append("ptc.plt_cantidad_cuotas ");
        sql.append("FROM ");
        sql.append("tarjetas_credito tc, ");
        sql.append("campanias_plan_tarjeta campt, ");
        sql.append("plan_tarjeta_credito ptc ");
        sql.append("WHERE ");
        sql.append("campt.cam_codigo LIKE ? ");
        sql.append(" AND ");
        sql.append("ptc.plt_codigo LIKE ");
        sql.append("campt.plt_codigo ");
        sql.append("AND ");
        sql.append("ptc.tar_codigo LIKE ");
        sql.append("tc.tar_codigo ");
        sql.append("AND ");
        sql.append("tc.tar_codigo LIKE ? ");
        
        params.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR ));
        params.add(new BoundParam(++pos,tarjeta.getTarCodigo(),VARCHAR ));
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql.toString(),params);
            while (rs.next()) {
                PlanTarjeta plan = new PlanTarjeta();
                plan.setPltCodigo(rs.getString(1));
                plan.setPltNombre(rs.getString(3));
                plan.setPltCantidadCuotas(rs.getInt(4));
                plan.setPltTarjeta(tarjeta);
                planes.add(plan);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return planes;
    }
}
